package com.malo.sistema.teste;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.malo.sistema.cliente.Cliente;
import com.malo.sistema.cliente.ClienteRN;
import com.malo.sistema.util.HibernateUtil;

public class ClienteTeste {

	private static Session sessao;
	private static Transaction transacao;

	@BeforeClass
	public static void abreConexao() {
		sessao = HibernateUtil.getSession().getCurrentSession();
		transacao = sessao.beginTransaction();
	}

	@AfterClass
	public static void fecharConexao() {

		try {
			transacao.commit();

		} catch (Throwable e) {
			System.out.println("Falha ao commitar: " + e.getMessage());

		} finally {
			try {
				if (sessao.isOpen()) {
					sessao.close();
				}
			} catch (Exception e2) {
				System.out.println("Falha ao fechar sess�o: " + e2.getMessage());

			}
		}
	}
	

	@Before
	public void setup(){
		
		Cliente c1 = new Cliente("12345678910", "Rua S�o Paulo", "Jefferson", "jefferson@malo.com.br", new Date(), 1000f);
		Cliente c2 = new Cliente("01298374653", "Rua Tricolor", "Ge", "ge@malo.com.br", new Date(), 2000f);
		Cliente c3 = new Cliente("02948673574", "Rua O melhor", "Malo", "malo@malo.com.br", new Date(), 3000f);
		Cliente c4 = new Cliente("01227672399", "Rua � n�is", "Maloqueiro", "enois@malo.com.br", new Date(), 4000f);
		Cliente c5 = new Cliente("32401329746", "Rua Teste", "Monje", "teste@malo.com.br", new Date(), 5000f);
		
		sessao.save(c1);
		sessao.save(c2);
		sessao.save(c3);
		sessao.save(c4);
		sessao.save(c5);
	}
	
	@After
	public void limpaBanco(){
		Criteria lista = sessao.createCriteria(Cliente.class);
		@SuppressWarnings("unchecked")
		List<Cliente> clientes = lista.list();
		
		for(Cliente cliente : clientes){
			sessao.delete(cliente);
		}
	}
	
	@Test
	public void salvarteste() {

		Query consulta = pesquisar("Jefferson");
		Cliente clientePesquisado = (Cliente)consulta.uniqueResult();
		ClienteRN clienteRN = new ClienteRN();

		clienteRN.salvar(clientePesquisado);

		assertEquals("12345678910", clientePesquisado.getCpf());
	}
	
	@Test
	public void listarTeste(){
		
		//Criteria lista = sessao.createCriteria(Cliente.class);
		ClienteRN clienteRN = new ClienteRN();
		
		List<Cliente> clientes = clienteRN.list();
		
		assertEquals(5, clientes.size());
	}
	
	@Test
	public void alterarTeste(){
		int renda = 6000;
		Query consulta = pesquisar("12345678910");
		Cliente clienteAlterar = (Cliente)consulta.uniqueResult();
		clienteAlterar.setRenda(renda);
		
		ClienteRN clienteRN = new ClienteRN();
		
		clienteRN.alterar(clienteAlterar);
		
		assertEquals(6000, clienteRN.equals(clienteAlterar));
		
		
	}
	
	@Test
	public void deletarTeste(){
		Query consulta = pesquisar("nois");
		Cliente clienteDeletar = (Cliente)consulta.uniqueResult();
		
		ClienteRN clienteRN = new ClienteRN();
		
		clienteRN.deletar(clienteDeletar);
		
		assertNull(clienteRN.equals(clienteDeletar));
	}
	
	private Query pesquisar(String parametro){
		String sql = "from Cliente c where c.nome like :nome";
		Query consulta = sessao.createQuery(sql);
		consulta.setString("nome", "%" + parametro + "%");
		return consulta;
	}

}
